"""
自定义迭代器:
    1. 自定义一个类
    2. 类中必须包含__iter__和__next__方法
"""
class my_range:
    # 初始化方法，接收两个参数，分别赋值给对象属性start和end
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        """
           返回对象本身作为迭代器。

           该方法使得对象可以被用作迭代器，通常与__next__方法配合使用
           来实现迭代协议。

           Returns:
               返回对象本身(self)，使其可以用于迭代操作
        """
        return self

    def __next__(self):
        """
           返回迭代器的下一个元素。
           该方法实现迭代器的核心功能，每次调用都会返回下一个元素。
           Raises:
               StopIteration: 当迭代完成时，抛出此异常，表示迭代结束。
           Returns:
               下一个元素
        """
        if self.start >= self.end:
            raise StopIteration
        else:
            value = self.start
            self.start += 1
            return value

# 注意：迭代器是惰性的，只有在需要的时候才会计算，因此可以无限迭代
if __name__ == '__main__':
    r = my_range(1, 5)

    # 使用next方法获取下一个元素，第一次调用next的时候，返回的是迭代器的第一个元素
    print(next(r))
    print(next(r))
    print(next(r))
    print(next(r))
    # 当迭代器没有更多元素时，再次调用next会抛出StopIteration异常
    # print(next(r))
    print("----------------------")
    for i in my_range(1, 5):
        print(i)
